import { createSlice } from '@reduxjs/toolkit'
import request from "@/utils/request"

export const article = createSlice({
  // 命名空间，在调用action的时候会默认的设置为action命令的前缀,避免冲突
  name: 'article',
  // 1. 定义变量(状态数据)
  initialState: {
    // 频道列表数据
    channelList: [],
    // 文章列表
    articleList: [],
    // 文章分页
    query: {
      total_count: 0, // 文章数据总条数
      page: 1, // 当前文章页码
      per_page: 10, // 每页数据条数
    }
  },
  // 2. 定义reducers更新变量(其中函数属性名作为action，在组件中可以dispatch触发reducer函数更新状态)
  reducers: {
    // 修改频道
    setChannelList (state, action) {
      state.channelList = action.payload
    },
    // 修改文章
    setArticleList (state, action) {
      // rest 解构剩余参数
      const { results, ...rest } = action.payload
      state.articleList = results
      state.query = rest
    }
  },
})

// 导出action函数(组件中可以dispatch(action函数)触发reducer更新状态)
export const { setChannelList, setArticleList } = article.actions

/**
 * 获取文章频道列表
 * @param {*} payload 
 * @returns 
 */
export function getChannelAction (payload) {
  return async (dispatch, getState) => {
    // 1. 获取后台频道数据
    const { data } = await request.get('/channels')
    console.log('频道：', data.data.channels)
    // 2. 存储频道数据到redux
    dispatch(setChannelList(data.data.channels))
  }
}

/**
 * params参数说明❓：
 * 1. 传空对象{} =》查询所有
 * 2. 不为空 =》查询指定条件的数据
 * @param {*} params:{status,channel_id,begin_pubdate,end_pubdate,page,per_page}
 * @returns 
 */
export function getArticleAction (params) {
  return async (dispatch, getState) => {
    const { data } = await request.get('/mp/articles', {
      params
    })
    console.log('文章列表：', data.data)

    dispatch(setArticleList(data.data))
  }
}
/**
 * 删除文章
 * @param {*} id 
 * @param {*} params 
 * @returns 
 */
export function deleteArticleAction (id, params) {
  return async dispatch => {
    await request.delete(`/mp/articles/${id}`)
    // 继续分发异步 action，获取最新的文章列表数据
    dispatch(getArticleAction(params))
  }
}
/**
 * 
 * @param {*} data 发布文章的参数{title, content, cover, channel_id}
 * @param {*} isDraft true:草稿 | false:正式
 * @param {*} isEdit 修改|发布
 * @returns 
 */
export function publishArticleAction (data, isDraft, isEdit) {
  return async (dispatch, getState) => {
    // await request.post(`/mp/articles?draft=${isDraft}`, data)
    if (!isEdit) {
      //  发布
      await request.post(`/mp/articles?draft=${isDraft}`, data)

    } else {
      // 修改
      await request.put(
        `/mp/articles/${data.id}?draft=${isDraft}`,
        data
      )
    }
  }
}



// 导出reducer(创建store使用)
export default article.reducer